home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 3.iso / dist / fw_qt3.idb / usr / freeware / Qt / examples / opengl / texture / gltexobj.cpp.z / gltexobj.cpp
C/C++ Source or Header  |  2002-04-08  |  6KB  |  247 lines

  1. /****************************************************************************
  2. ** $Id:  qt/gltexobj.cpp   3.0.3   edited Oct 12 12:18 $
  3. **
  4. ** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
  5. **
  6. ** This file is part of an example program for Qt.  This example
  7. ** program may be used, distributed and modified without limitation.
  8. **
  9. *****************************************************************************/
  10.  
  11. /****************************************************************************
  12. **
  13. ** This is a simple QGLWidget demonstrating the use of QImages for textures.
  14. **
  15. ** Much of the GL code is inspired by the 'spectex' and 'texcyl' 
  16. ** public domain demo programs by Brian Paul
  17. **
  18. ****************************************************************************/
  19.  
  20. #include "gltexobj.h"
  21. #include <qimage.h>
  22. #include <qtimer.h>
  23. #if defined(Q_OS_MAC)
  24. #include <glu.h>
  25. #else
  26. #include <GL/glu.h>
  27. #endif
  28.  
  29.  
  30. const int redrawWait = 50;
  31.  
  32. /*!
  33.   Create a GLTexobj widget
  34. */
  35.  
  36. GLTexobj::GLTexobj( QWidget* parent, const char* name )
  37.     : QGLWidget( parent, name )
  38. {
  39.     xRot = yRot = zRot = 0.0;        // default object rotation
  40.     scale = 5.0;            // default object scale
  41.     object = 0;
  42.     animation = TRUE;
  43.     timer = new QTimer( this );
  44.     connect( timer, SIGNAL(timeout()), SLOT(update()) );
  45.     timer->start( redrawWait, TRUE );
  46. }
  47.  
  48.  
  49. /*!
  50.   Release allocated resources
  51. */
  52.  
  53. GLTexobj::~GLTexobj()
  54. {
  55.     makeCurrent();
  56.     glDeleteLists( object, 1 );
  57. }
  58.  
  59.  
  60. /*!
  61.   Paint the texobj. The actual openGL commands for drawing the texobj are
  62.   performed here.
  63. */
  64.  
  65. void GLTexobj::paintGL()
  66. {
  67.     if ( animation ) {
  68.     xRot += 1.0;
  69.     yRot += 2.5;
  70.     zRot -= 5.0;
  71.     }
  72.     glClear( GL_COLOR_BUFFER_BIT );
  73.     glPushMatrix();
  74.     glRotatef( xRot, 1.0, 0.0, 0.0 ); 
  75.     glRotatef( yRot, 0.0, 1.0, 0.0 ); 
  76.     glRotatef( zRot, 0.0, 0.0, 1.0 );
  77.     glScalef( scale, scale, scale );
  78.     glCallList( object );
  79.     glPopMatrix();
  80.  
  81.     if ( animation ) {
  82.     glFlush(); // Make sure everything is drawn before restarting timer
  83.     timer->start( redrawWait, TRUE ); // Wait this many msecs before redraw
  84.     }
  85. }
  86.  
  87.  
  88. /*!
  89.   Set up the OpenGL rendering state, and define display list
  90. */
  91.  
  92. void GLTexobj::initializeGL()
  93. {
  94.     // Set up the lights
  95.  
  96.     GLfloat whiteDir[4] = {2.0, 2.0, 2.0, 1.0};
  97.     GLfloat whiteAmb[4] = {1.0, 1.0, 1.0, 1.0};
  98.     GLfloat lightPos[4] = {30.0, 30.0, 30.0, 1.0};
  99.  
  100.     glEnable(GL_LIGHTING);
  101.     glEnable(GL_LIGHT0);
  102.     glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
  103.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, whiteAmb);
  104.  
  105.     glMaterialfv(GL_FRONT, GL_DIFFUSE, whiteDir);
  106.     glMaterialfv(GL_FRONT, GL_SPECULAR, whiteDir);
  107.     glMaterialf(GL_FRONT, GL_SHININESS, 20.0);
  108.  
  109.     glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteDir);        // enable diffuse
  110.     glLightfv(GL_LIGHT0, GL_SPECULAR, whiteDir);    // enable specular
  111.     glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
  112.  
  113.     // Set up the textures
  114.  
  115.     QImage tex1, tex2, buf;
  116.  
  117.     if ( !buf.load( "gllogo.bmp" ) ) {    // Load first image from file
  118.     qWarning( "Could not read image file, using single-color instead." );
  119.     QImage dummy( 128, 128, 32 );
  120.     dummy.fill( Qt::green.rgb() );
  121.     buf = dummy;
  122.     }
  123.     tex1 = QGLWidget::convertToGLFormat( buf );  // flipped 32bit RGBA
  124.  
  125.     if ( !buf.load( "qtlogo.bmp" ) ) {    // Load first image from file
  126.     qWarning( "Could not read image file, using single-color instead." );
  127.     QImage dummy( 128, 128, 32 );
  128.     dummy.fill( Qt::red.rgb() );
  129.     buf = dummy;
  130.     }
  131.     tex2 = QGLWidget::convertToGLFormat( buf );  // flipped 32bit RGBA
  132.  
  133.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
  134.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
  135.     glEnable( GL_TEXTURE_2D );
  136.  
  137.     // Set up various other stuff
  138.  
  139.     glClearColor( 0.0, 0.0, 0.0, 0.0 ); // Let OpenGL clear to black
  140.     glEnable( GL_CULL_FACE );      // don't need Z testing for convex objects
  141.     glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
  142.  
  143.     // Make the object display list
  144.  
  145.     object = makeObject( tex1, tex2 );    // Generate an OpenGL display list
  146. }
  147.  
  148.  
  149.  
  150. /*!
  151.   Set up the OpenGL view port, matrix mode, etc.
  152. */
  153.  
  154. void GLTexobj::resizeGL( int w, int h )
  155. {
  156.     glViewport( 0, 0, w, h );
  157.     glMatrixMode( GL_PROJECTION );
  158.     glLoadIdentity();
  159.     glFrustum( -1.0, 1.0, -1.0, 1.0, 10.0, 100.0 );
  160.     glMatrixMode( GL_MODELVIEW );
  161.     glLoadIdentity();
  162.     glTranslatef( 0.0, 0.0, -70.0 );
  163. }
  164.  
  165.  
  166. /*!
  167.   Generate an OpenGL display list for the object to be shown, i.e. the texobj
  168. */
  169.  
  170. GLuint GLTexobj::makeObject( const QImage& tex1, const QImage& tex2 )
  171. {
  172.     GLUquadricObj* q = gluNewQuadric();
  173.     GLuint cylinderObj = glGenLists(1);
  174.     glNewList( cylinderObj, GL_COMPILE );
  175.  
  176.     glTranslatef( 0.0, 0.0, -1.0 );
  177.  
  178.     // cylinder
  179.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1.width(), tex1.height(), 0,
  180.           GL_RGBA, GL_UNSIGNED_BYTE, tex1.bits() );
  181.     gluQuadricTexture( q, GL_TRUE );
  182.     gluCylinder(q, 0.6, 0.6, 2.0, 24, 1);
  183.  
  184.     // end cap
  185.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex2.width(), tex2.height(), 0,
  186.           GL_RGBA, GL_UNSIGNED_BYTE, tex2.bits() );
  187.     glTranslatef( 0.0, 0.0, 2.0 );
  188.     gluDisk( q, 0.0, 0.6, 24, 1 );
  189.  
  190.     // other end cap
  191.     glTranslatef( 0.0, 0.0, -2.0 );
  192.     gluQuadricOrientation( q, (GLenum)GLU_INSIDE );
  193.     gluDisk( q, 0.0, 0.6, 24, 1 );
  194.  
  195.     glEndList();
  196.     gluDeleteQuadric( q );
  197.  
  198.     return cylinderObj;
  199. }
  200.  
  201.  
  202. /*!
  203.   Set the rotation angle of the object to \e degrees around the X axis.
  204. */
  205.  
  206. void GLTexobj::setXRotation( int degrees )
  207. {
  208.     xRot = (GLfloat)(degrees % 360);
  209.     updateGL();
  210. }
  211.  
  212.  
  213. /*!
  214.   Set the rotation angle of the object to \e degrees around the Y axis.
  215. */
  216.  
  217. void GLTexobj::setYRotation( int degrees )
  218. {
  219.     yRot = (GLfloat)(degrees % 360);
  220.     updateGL();
  221. }
  222.  
  223.  
  224. /*!
  225.   Set the rotation angle of the object to \e degrees around the Z axis.
  226. */
  227.  
  228. void GLTexobj::setZRotation( int degrees )
  229. {
  230.     zRot = (GLfloat)(degrees % 360);
  231.     updateGL();
  232. }
  233.  
  234.  
  235. /*!
  236.   Turns animation on or off
  237. */
  238.  
  239. void GLTexobj::toggleAnimation()
  240. {
  241.     animation = !animation;
  242.     if ( animation )
  243.     updateGL();
  244.     else
  245.     timer->stop();
  246. }
  247.